## MyContainersCPP
Реализация библиотек my_containers.h и my_containersplus.h.

В данном проекте библиотека my_containers.h реализует основные стандартные контейнерные классы языка С++: `list` (список), `map` (словарь), `queue` (очередь), `set` (множество), `stack` (стек) и `vector` (вектор). Библиотека my_containersplus.h реализует контейнерные классы языка С++:`array` (массив), `multiset` (мультимножество).

Реализации предоставляют набор стандартных методов и атрибутов для работы с элементами, проверкой заполненности контейнера и итерирования.

Каждый вид контейнеров предоставляет пользователю следующие методы:

- стандартные конструкторы (конструктор по умолчанию, конструктор копирования, конструктор перемещения, конструктор со списком инициализации);

- методы доступа к элементам контейнера (например, осуществление доступа к элементу с индексом i);

- методы проверки наполненности контейнера (например, количество элементов в контейнере, проверка на пустоту контейнера);

- методы изменения контейнера (удаление и добавление новых элементов, очистка контейнера);

- методы для работы с итератором контейнера.

Итераторы обеспечивают доступ к элементам контейнера. Для каждого контейнера конкретный тип итератора будет отличаться. Это связано с различным видом организации наборов объектов в контейнерных классах, а также с фактической реализацией контейнера. Итераторы реализуются в таком виде, чтобы они работали схожим образом с указателем на элемент массива языка С. Именно такой подход через использование итераторов и позволяет взаимодействовать с любыми контейнерами одинаковым образом. Через методы `begin()` и `end()` контейнеры предоставляют итераторы, которые указывают на первый и следующий после последнего элементы контейнера соответственно.

Над итератором `iter` определены следующие операции:

- `*iter`: получение элемента, на который указывает итератор;

- `++iter`: перемещение итератора вперед для обращения к следующему элементу;

- `--iter`: перемещение итератора назад для обращения к предыдущему элементу;

- `iter1 == iter2`: два итератора равны, если они указывают на один и тот же элемент;

- `iter1 != iter2`: два итератора не равны, если они указывают на разные элементы.

<br>Контейнеры реализованы на основе шаблонных классов.

Контейнеры подразделяются на два основных типа: последовательные и ассоциативные. Для нахождения элемента в последовательных контейнерах (`list`, `vector`, `array`, `stack`, `queue`) необходимо последовательно просмотреть весь контейнер, в то время как в ассоциативных (`map`, `set`, `multiset`) достаточно обратиться по ассоциированному с значением ключу.

### Спецификации

Библиотека my_containers.h:<br>
[List](specifications/list.md)<br>
[Map](specifications/map.md)<br>
[Queue](specifications/queue.md)<br>
[Set](specifications/set.md)<br>
[Stack](specifications/stack.md)<br>
[Vector](specifications/vector.md)<br>

Библиотека my_containersplus.h:<br>
[Array](specifications/array.md)<br>
[Multiset](specifications/multiset.md)<br>

### Реализация библиотек

- Программа разработана на языке C++ стандарта C++17 с использованием компилятора g++;
- Код соответствует Google Style;
- Используются итераторы;
- Классы шаблонные;
- Классы реализованы внутри пространства имен `mycontainers`;
- Подготовлено покрытие unit-тестами методов контейнерных классов c помощью библиотеки GTest;
- Соблюдена логика работы стандартной библиотеки шаблонов (STL) (в части проверок, работы с памятью и поведения в нештатных ситуациях).
- Решение оформлено в виде заголовочных файлов `my_containers.h` и `my_containersplus.h`, которые включают в себя другие заголовочные файлы с реализациями необходимых контейнеров (`my_list.h`, `my_map.h` и т.д.);
- Предусмотрен Makefile для тестов написанных библиотек (с целями all, clean, test, gcov_report);
